"""
迭代器：实现了迭代协议的对象。
有些编程语言中有interface/protocol语法，可以用来定义协议
一个类遵守了某种协议这个类的对象就一定有某种行为
Python中通过魔术方法（魔法方法）来表示协议，迭代器协议是两个魔术方法：
    ~ __iter__ ---> 返回迭代器对象
    ~ __next__ ---> 取下一个迭代元素
上下文管理器：实现了上下文管理器协议的对象。
    ~ __enter__ ---> 进入with上下文时要执行的操作
    ~ __exit__ ---> 离开with上下文时要执行的操作
"""


class FibIter:

    def __init__(self, num):
        self.a, self.b = 0, 1
        self.counter = 0
        self.num = num

    def __iter__(self):
        return self

    def __next__(self):
        if self.counter < self.num:
            self.a, self.b = self.b, self.a + self.b
            self.counter += 1
            return self.a
        raise StopIteration()


it = FibIter(20)
for value in it:
    print(value)
